Node.js File System

Node.js fs(file system) 即是内置的文件系统模块,用于负责文件的到做以及读取等,可通过 console fs = require("fs") 直接进行引入,因此为了更详细的分清该模块所提供的 API,主要分为:“文件属性读写、文件内容读写、文件操作” 等三种。

fs 模块所提供的方法最大不同之处在于同时还提供了 异步、同步 两个方法,这体现在了 fs.readFile()fs.readFileSync()

.fs.readFile(path[, options], callback) 异步读取文件的全部内容
.fs.readFileSync(path[, options]) 用于返回 path 内容即同步

Id Name Info Type
1 fs.readFile(path[, options], callback) 用于异步读取文件 文件内容读写
2 fs.readFileSync(path[, options]) 同步读取文件 文件内容读写
3 fs.read(fd, buffer, offset, length, position, callback) 在异步模式下更加合理的读取文件 文件内容读写
fd 通过 fs.open() 所返回的文件描述
buffer 数据写入缓冲区
offset 缓冲区写入数据写入的偏移量
length 需要读取的字节数
position 文件读取的起始位置
callback 回调函数
err 返回错误信息
bytesRead 所读取的字节数
buffer 缓冲区对象
4 fs.open(path[, flags[, mode]], callback) 异步打开文件 底层文件操作
path 文件路径
flags 文件的打开行为
a 如果文件不存在则创建文件
ax a 的基础上,如果文件路径不存在,就失败
a+ 如果文件不存在就创建
ax+ a+ 的基础上,如果文件路径不存在,则读取失败
r 以读取的方式打开文件,如果文件不存在则异常
r+ 以读写模式打开文件,如果文件不存在就抛出异常
rs 以同步的方式读取文件
rs+ 以同步的方式读取和写入文件
w 以写入模式打开文件,文件不存在则创建
wx w 的基础上,如果文件路径存在,文件将会写入失败
w+ 以读写模式打开文件,如果文件不存在则创建
wx+ w+ 的基础上,如果文件路径存在,则文件写入失败
mode 打开的权限
callback 回调参数
5 fs.writeFile(file, data[, options], callback) 通过异步的方式写入文件 文件内容读写
file 文件名
data 需要写入的数据
options 一个参数对象,包含了编码模式(utf-8)以及 flags(w,写入模式打开文件,文件不存在则创建)
6 fs.writeFileSync() 通过同步的方式写入文件 文件内容读写
7 fs.stat() 用于读取文件属性 文件属性读写

readFile at readFileSync 读取文件

fs.readFile()

1
2
3
4
5
6
7
8
9
10
const fs = require('fs')

fs.readFile('data.txt', 'utf-8', function (err, data) {
if (err) {
console.log(err)
} else {
// File system!
console.log(data.toString())
}
})

data.txt

File system!

.fs.readFile()fs.readFileSync() 的主要区别就是一个支持异步而另一个仅仅是同步方法,这主要可以根据其 callback() 就可以分辨出两者的作用与功能上的区分。

这主要涉及到 errdata 两个参数,后者为 undefined,也就是其 path 内的数据以字符串的形式进行读取,当发生错误时将会输出 err 对象。

fs.readFIleSync()

1
2
3
4
5
6
const fs = require('fs')

var data = fs.readFileSync('data.txt', 'utf-8')

// File system!
console.log(data)

通常默认情况下单个 fs.readFIleSync() 参数是不支持输出错误的,因此我们还需要输出函数的方式输出数据,可配合 try...catch 的方式来实现错误输出:

1
2
3
4
5
6
7
8
const fs = require('fs')

try {
var data = fs.readFileSync('data.txt', 'utf-8')
console.log(data)
} catch (err) {
console.log(err)
}

fs.read(fd, buffer, offset, length, position, callback) at fs.open and fs.close

Id Name Info Type
1 fs.read(fd, buffer, offset, length, position, callback) 在异步模式下更加合理的读取文件 文件内容读写
fd 通过 fs.open() 所返回的文件描述
buffer 数据写入缓冲区
offset 缓冲区写入数据写入的偏移量
length 需要读取的字节数
position 文件读取的起始位置
callback 回调函数
err 返回错误信息
bytesRead 所读取的字节数
buffer 缓冲区对象

.fs.read() 可用于更加合理的文件操作,这其中主要包括了 文件打开 -> 文件写入 —> 文件读取 -> 关闭文件 的整一套流程,让整个对文件的操作更加合理和直观

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const fs = require('fs')
const buf = new Buffer.alloc(1024)

/*
准备打开文件
文件打开成功
开始准备读取文件
文件内容为: Hello, File system
文件关闭成功
*/

console.log("准备打开文件")

fs.open('data.txt', 'r+', function (err,fd) {
if (err) {
console.log(err)
}
console.log('文件打开成功\n开始准备读取文件')
fs.read(fd, buf, 0, buf.length, 0, function (err, bytesRead) {
if (err) {
console.log(err)
}

if (bytesRead>0) {
console.log('文件内容为:',buf.slice(0,bytesRead).toString())
}

fs.close(fd, function (err) {
if (err) {
console.log(err)
}
console.log('文件关闭成功')
})
})
})

fs.open()

Id Name Info Type
1 fs.open(path[, flags[, mode]], callback) 异步打开文件 底层文件操作
path 文件路径
flags 文件的打开行为
a 如果文件不存在则创建文件
ax a 的基础上,如果文件路径不存在,就失败
a+ 如果文件不存在就创建
ax+ a+ 的基础上,如果文件路径不存在,则读取失败
r 以读取的方式打开文件,如果文件不存在则异常
r+ 以读写模式打开文件,如果文件不存在就抛出异常
rs 以同步的方式读取文件
rs+ 以同步的方式读取和写入文件
w 以写入模式打开文件,文件不存在则创建
wx w 的基础上,如果文件路径存在,文件将会写入失败
w+ 以读写模式打开文件,如果文件不存在则创建
wx+ w+ 的基础上,如果文件路径存在,则文件写入失败
1
2
3
4
5
6
7
8
9
const fs = require('fs')

// 文件打开成功
fs.open('data.txt', 'r+', function (err, fd) {
if (err) {
return console.error(err)
}
console.log("文件打开成功")
})

fs.writeFile()

Id Name Info Type
1 fs.writeFile(file, data[, options], callback) 通过异步的方式写入文件 文件内容读写
file 文件名
data 需要写入的数据
options 一个参数对象,包含了编码模式(utf-8)以及 flags(w,写入模式打开文件,文件不存在则创建)
1
2
3
4
5
6
7
8
9
// 写入成功: Hello, File system
fs.writeFile('data.txt', data, function (err) {
if (err) {
console.log(err)
} else {
var write = fs.readFileSync('data.txt', 'utf-8')
console.log('写入成功:' ,write)
}
})

fs.writeFileSync()

.fs.writeFileSync()fs.writeFile() 的同步方法,同样也可以使用 try...catch 来支持返回 err 信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
const fs = require('fs')

var data = "Hello, File system"

fs.open('data.txt','r+', function (err,fd) {
if (err) {
return console.error(err)
} else {
fs.writeFileSync('data.txt', data)
// 写入成功 Hello, File system
console.log('写入成功', data )
}
})

获取文件属性 (fs.stat())

“获取文件属性”是指文件的大小、创建时间、修改时间等信息,可以通过 fs.stat(path[, options], callback) 来进行实现,在这个方法中存在着 fs.stats 类,用于获取文件的属性,常用的为:

Id Name Info
1 stat.isFile() 是否是文件
2 stat.isDirectory() 是否是目录
3 stat.size() 文件大小(以字节为单位)
4 stat.birthtime() 创建时间
5 stat.mtime() 修改时间
6 stat.ctime() 最后一次更改时间
7 stat.atimeMS() 最后一次访问时间
8 stat.mtimeMS() 最后一次修改时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs')

/*
是否是文件: true
文件大小: 18
创建时间: 2021-09-01T02:23:04.637Z
修改时间: 2021-09-01T02:23:04.637Z
最后访问: 2021-09-01T02:23:04.949Z
*/
fs.stat('data.txt', function (err, stat) {
if (err) {
console.log(err)
} else {
console.log("是否是文件:", stat.isFile())
if (stat.isFile()) {
console.log('文件大小:', stat.size)
console.log('创建时间:', stat.birthtime)
console.log('修改时间:', stat.mtime) // stat.ctime
console.log('最后一次访问时间:', stat.atime)
}
}
})

本文使用《江雪分析公开知识存储库知识共享许可证》进行发布